package com.shurdroides.proyectofinal.adapters;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.shurdroides.proyectofinal.R;
import com.shurdroides.proyectofinal.constants.Constants;
import com.shurdroides.proyectofinal.model.GridViewObject;

public class GridViewBaseAdapter extends BaseAdapter implements
		Constants.Generacio {

	Context mContext;
	ArrayList<GridViewObject> array;
	ArrayList<GridViewObject> arrayAll;
	int generacio;
	int pos;

	public GridViewBaseAdapter(Context ctx, int generacio) {
		super();
		mContext = ctx;
		this.generacio = generacio;
		array = new ArrayList<GridViewObject>();
		arrayAll = new ArrayList<GridViewObject>();
		pos = 0;
	}

	public void setDuracio() {
		ArrayList ar = new ArrayList<GridViewObject>();
		for (int aux = 0; aux < array.size(); aux++) {
			array.get(aux).setDuracion(array.get(aux).getDuracion() - 1);
			arrayAll.get(aux).setDuracion(arrayAll.get(aux).getDuracion() - 1);
			if (array.get(aux).getDuracion() <= 0) {
				ar.add(array.get(aux));
			}
		}
		array.removeAll(ar);
	}

	public boolean hasItems() {
		return !array.isEmpty();
	}

	public int getPosition(GridViewObject obj) {
		return array.indexOf(obj);
	}

	public ArrayList<GridViewObject> getArray() {
		return (ArrayList<GridViewObject>) array.clone();
	}

	public ArrayList<GridViewObject> getArrayComplete() {
		return (ArrayList<GridViewObject>) arrayAll.clone();
	}

	public void addItemToRes(int pos, GridViewBaseAdapter resAdapter) {
		if (resAdapter.checkIfContains(array.get(pos).getId())) {
			resAdapter.getItemById(array.get(pos).getId()).setCantidad_inv(
					resAdapter.getItemById(array.get(pos).getId())
							.getCantidad_inv() + 1);
		} else {
			GridViewObject obj = array.get(pos).clone();
			obj.setCantidad_casa(0);
			obj.setCantidad_inv(1);
			resAdapter.addItem(obj);
		}
	}

	public void addItemToIng(int pos, GridViewBaseAdapter ingAdapter) {
		if (ingAdapter.checkIfContains(array.get(pos).getId())) {
			ingAdapter.getItemById(array.get(pos).getId()).setCantidad_inv(
					ingAdapter.getItemById(array.get(pos).getId())
							.getCantidad_inv() + 1);
			ingAdapter.getItemByIdFromAll(array.get(pos).getId())
					.setCantidad_inv(
							ingAdapter.getItemById(array.get(pos).getId())
									.getCantidad_inv() + 1);
		} else {
			GridViewObject obj = array.get(pos).clone();
			obj.setCantidad_casa(0);
			obj.setCantidad_inv(1);
			ingAdapter.addItem(obj);
		}
	}

	private void addItem(GridViewObject v) {
		array.add(v);
	}

	public void addItems(List<GridViewObject> v) {
		for (int aux = 0; aux < v.size(); aux ++) {
			arrayAll.add(v.get(aux).clone());
		}
		array.addAll(v);
	}

	public void clear() {
		array.clear();
	}

	public void removeItem(int pos) {
		array.remove(pos);
	}

	public void treuElementIng(int pos) {

		if (generacio == INV) {
			getItem(pos).setCantidad_inv(getItem(pos).getCantidad_inv() - 1);
			arrayAll.get(pos).setCantidad_inv(
					getItem(pos).getCantidad_inv() - 1);
		
			if (getItem(pos).getCantidad_inv() == 0) {
				removeItem(pos);
			}
		} else {

			if (getItem(pos).getCantidad_inv() <= 0) {
				getItem(pos).setCantidad_casa(
						getItem(pos).getCantidad_casa() - 1);
				arrayAll.get(pos).setCantidad_casa(
						getItem(pos).getCantidad_casa() - 1);
			} else {
				getItem(pos)
						.setCantidad_inv(getItem(pos).getCantidad_inv() - 1);
				arrayAll.get(pos).setCantidad_inv(
						getItem(pos).getCantidad_inv() - 1);
			}
			if (getItem(pos).getCantidad_casa() <= 0) {
				removeItem(pos);
			}
		}

	}

	public void treuElementRes(int pos) {

		getItem(pos).setCantidad_inv(getItem(pos).getCantidad_inv() - 1);
		if (getItem(pos).getCantidad_inv() == 0) {
			removeItem(pos);
		}
	}

	@Override
	public int getCount() {
		return array.size();
	}

	public void removeAllItems() {
		array.clear();
	}

	@Override
	public GridViewObject getItem(int position) {
		return array.get(position);
	}

	public GridViewObject getNewItem(int position) {
		return array.get(position).clone();
	}

	public GridViewObject getItemById(int id) {
		int aux = 0;
		while (aux < array.size() && id != array.get(aux).getId()) {
			aux++;
		}
		return array.get(aux);
	}

	public GridViewObject getItemByIdFromAll(int id) {
		int aux = 0;
		while (aux < arrayAll.size() && id != arrayAll.get(aux).getId()) {
			aux++;
		}
		return arrayAll.get(aux);
	}

	public GridViewObject getNewItemById(int id) {
		int aux = 0;
		while (aux < array.size() && id != array.get(aux).getId()) {
			aux++;
		}
		return array.get(aux).clone();
	}

	public boolean checkIfContains(int id) {
		boolean ck = false;

		for (int aux = 0; aux < array.size() && !ck; aux++) {
			ck = array.get(aux).getId() == id;
		}
		return ck;
	}

	@Override
	public long getItemId(int position) {
		return array.get(position).getId();
	}

	public void setPosition(int pos) {
		this.pos = pos;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		if (convertView == null) {
			LayoutInflater inflater = LayoutInflater.from(mContext);
			convertView = inflater.inflate(R.layout.gridview_entry, parent,
					false);
			convertView.setId(pos + position);
		}
		((ImageView) convertView.findViewById(R.id.grid_entry_img))
				.setImageResource(array.get(convertView.getId()).getFoto());
		((TextView) convertView.findViewById(R.id.grid_obj_name)).setText(array
				.get(convertView.getId()).getNom());
		((TextView) convertView.findViewById(R.id.grid_obj_name))
				.bringToFront();
		if (generacio == Constants.Generacio.CASA) {
			((TextView) convertView.findViewById(R.id.grid_entry_txt))
					.setText("x"
							+ (array.get(convertView.getId())
									.getCantidad_casa() + array.get(
									convertView.getId()).getCantidad_inv()));
		} else {
			((TextView) convertView.findViewById(R.id.grid_entry_txt))
					.setText("x"
							+ array.get(convertView.getId()).getCantidad_inv());
		}
		return convertView;
	}

}